/*!
 * \file WtExecPorter.cpp
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 执行监控Porter接口实现
 * 
 * \details 本文件实现了WonderTrader执行监控模块的C语言接口，
 *          提供执行监控系统的完整生命周期管理和功能调用。
 *          
 *          主要实现功能：
 *          - 执行监控系统的初始化和配置
 *          - 系统运行和资源释放管理
 *          - 日志记录和版本信息查询
 *          - 持仓目标设置和执行监控
 *          - 跨平台支持（Windows/Unix）
 *          
 *          该实现采用单例模式管理执行运行器，确保系统的唯一性和一致性。
 */
#include "WtExecPorter.h"
#include "WtExecRunner.h"

#include "../WtCore/WtHelper.h"
#include "../WTSTools/WTSLogger.h"
#include "../Includes/WTSVersion.h"

#ifdef _WIN32
#   ifdef _WIN64
    char PLATFORM_NAME[] = "X64";		/*!< 64位Windows平台标识 */
#   else
    char PLATFORM_NAME[] = "X86";		/*!< 32位Windows平台标识 */
#   endif
#else
    char PLATFORM_NAME[] = "UNIX";		/*!< Unix/Linux平台标识 */
#endif

/*!
 * \brief 获取执行运行器实例
 * 
 * \details 获取执行运行器的单例实例，采用静态局部变量实现单例模式。
 *          确保整个系统中只有一个执行运行器实例。
 * 
 * \return 执行运行器的引用
 * 
 * \note 该函数是线程安全的（C++11标准保证）
 */
WtExecRunner& getRunner()
{
	static WtExecRunner runner;
	return runner;
}

/*!
 * \brief 初始化执行监控系统
 * 
 * \details 初始化执行监控系统的日志配置和基础环境。
 *          该函数具有幂等性，重复调用不会产生副作用。
 *          支持从文件或字符串内容加载日志配置。
 * 
 * \param logCfg 日志配置文件路径或配置内容
 * \param isFile 是否为文件路径，true表示文件路径，false表示配置内容
 * 
 * \note 该函数必须在其他所有函数之前调用
 */
void init_exec(WtString logCfg, bool isFile /*= true*/)
{
	static bool inited = false;

	if (inited)
		return;

	getRunner().init(logCfg);

	inited = true;
}

/*!
 * \brief 配置执行监控系统
 * 
 * \details 加载执行监控系统的配置文件，包括基础数据、
 *          行情解析器、交易通道、执行器等配置信息。
 *          如果配置文件路径为空，则使用默认配置文件"cfgexec.json"。
 * 
 * \param cfgfile 配置文件路径或配置内容
 * \param isFile 是否为文件路径，true表示文件路径，false表示配置内容
 * 
 * \note 必须在init_exec之后、run_exec之前调用
 */
void config_exec(WtString cfgfile, bool isFile /*= true*/)
{
	if (strlen(cfgfile) == 0)
		getRunner().config("cfgexec.json");
	else
		getRunner().config(cfgfile);
}

/*!
 * \brief 运行执行监控系统
 * 
 * \details 启动执行监控系统的所有组件，包括行情解析器、
 *          交易通道、执行器等。系统开始接收行情数据、
 *          处理交易指令和执行监控逻辑。
 * 
 * \note 该函数会阻塞当前线程，直到系统停止运行
 */
void run_exec()
{
	getRunner().run();
}

/*!
 * \brief 释放执行监控系统资源
 * 
 * \details 停止执行监控系统的运行，释放所有分配的资源，
 *          包括行情解析器、交易通道、执行器等组件。
 *          该函数应在系统退出前调用。
 * 
 * \note 调用该函数后，系统将停止所有监控和执行活动
 */
void release_exec()
{
	getRunner().release();
}

/*!
 * \brief 获取版本信息
 * 
 * \details 获取执行监控系统的版本信息字符串，
 *          包括平台信息、版本号、编译日期和时间。
 *          版本信息格式：[平台] [版本号] Build@[编译日期] [编译时间]
 * 
 * \return 版本信息字符串指针
 * 
 * \note 返回的字符串指针指向静态内存，无需释放
 */
WtString get_version()
{
	static std::string _ver;
	if (_ver.empty())
	{
		_ver = PLATFORM_NAME;
		_ver += " ";
		_ver += WT_VERSION;
		_ver += " Build@";
		_ver += __DATE__;
		_ver += " ";
		_ver += __TIME__;
	}
	return _ver.c_str();
}

/*!
 * \brief 写入日志消息
 * 
 * \details 向执行监控系统的日志系统写入指定级别的日志消息。
 *          支持按分类记录日志，便于日志管理和问题排查。
 * 
 * \param level 日志级别（参考WTSLogLevel枚举）
 * \param message 日志消息内容
 * \param catName 日志分类名称，空字符串表示使用默认分类
 * 
 * \note 日志级别包括：调试、信息、警告、错误等
 */
void write_log(unsigned int level, WtString message, WtString catName)
{
	if (strlen(catName) > 0)
	{
		WTSLogger::log_raw_by_cat(catName, (WTSLogLevel)level, message);
	}
	else
	{
		WTSLogger::log_raw((WTSLogLevel)level, message);
	}
}

/*!
 * \brief 设置持仓目标
 * 
 * \details 为指定合约设置目标持仓量，执行监控系统将根据
 *          当前持仓和目标持仓的差异，自动执行相应的交易指令。
 *          支持多空持仓，正数表示多头，负数表示空头，零表示平仓。
 * 
 * \param stdCode 标准合约代码（如：SHFE.rb2101）
 * \param targetPos 目标持仓量，正数为多头，负数为空头，0为平仓
 * 
 * \note 执行器将根据配置的执行策略（如TWAP、最小冲击等）执行交易
 */
void set_position(WtString stdCode, double targetPos)
{
	getRunner().setPosition(stdCode, targetPos);
}